#include "Array.h"
#include <iostream>
#include <string.h>
#include <exception>

using namespace std;

Array::Array(int size) : m_position(0), m_length(size), m_data(new int[m_length])
{
}

Array::Array(const Array &arr) : m_position(arr.m_position), m_length(arr.m_length), m_data(new int[m_length])
{
    memcpy(m_data, arr.m_data, sizeof(int) * m_length);

    // for(int i = 0; i < m_length; i++)
    //     m_data[i] = arr.m_data[i];
}

Array::~Array()
{
}

int Array::size()
{
    return m_position;
}

int Array::capacity() const 
{
    return m_length;
}

int Array::at(int index)
{
    if(index < 0 || index >= m_length) {
        throw out_of_range("index out of range.");
    }
    return m_data[index];
}

int Array::front()
{
    if(m_position <= 0) {
        throw out_of_range("array is empty.");
    }
    return m_data[0];
}

int Array::back()
{
    if(m_position <= 0) {
        throw out_of_range("array is empty.");
    }
    return m_data[m_position - 1];
}

bool Array::empty()
{
    return m_position == 0 ? true : false;
}

void Array::push_front(int data)
{
    /**
     * 1. 判断数据为空，直接将数据放在以一个位置
     * 2. 判断空间是否满了，满了则需要先申请新的内存空间，再将数据拷贝至新的内存空间上
     * 3. 如果数组不为空，需要先将原来的数据往后移动一个，再将数据插入
    */
    if(empty()) {
        m_data[0] = data;
        ++m_position;
        return;
    }

    if(m_position == m_length) {
        int *temp = int [m_length * 2];
        temp[0] = data;
        memcpy(temp + 1, m_data, sizeof(int) * m_position);
        m_length *= 2;

        // 释放原来内存空间
        delete[] m_data;
        // 将新内存地址赋值到 m_data
        m_data = temp;
        ++m_position;
        return;
    }

    memcpy(m_data + 1, m_data, sizeof(int) * m_position);
    m_data[0] = data;
    ++m_position;
    return;
}   

void Array::push_back(int data)
{
    /**
     * 1. 判断空间是否满了，满了需要扩容
     * 2. 空间没满，直接在后面加入数据
    */
    if(m_position == m_length) {
        int *temp = int [m_length * 2];
        memcpy(temp, m_data, sizeof(int) * m_position);
        m_length *= 2;

        // 释放原来内存空间
        delete[] m_data;
        // 将新内存地址赋值到 m_data
        m_data = temp;
        m_data[m_position] = data;
        ++m_position;
        return;
    }

    m_data[m_position] = data;
    ++m_position;
    return;
}
              
void Array::insert(int pos, int data)
{

}
      
void Array::insert(int pos, const Array& arr)
{

}

void Array::pop_front()
{
    /**
     * 1. 判空
     * 2. 直接将数据整体往前移动一个位置
    */
    if(empty())
        return;

    memcpy(m_data, m_data + 1, sizeof(int) * (m_position - 1));
    --m_position;
}

void Array::pop_back()
{
    /**
     * 1. 判空
     * 2. 删除
    */
    if(empty())
        return;

    --m_position;
}
                  
void Array::remove(int pos)
{
    /**
     * 1. 判空
     * 2. 判断下标是否越界
     * 3. 将下标后数据整体往前移动一个
    */
}
                
void Array::remove(int pos, int len)
{
    /**
     * 1. 判空
     * 2. 判断下标是否越界
     * 3. 将下标后数据整体往前移动一个
    */
}      